package cn.lg.soar.common.algorithm;

import java.util.zip.CRC32;

/**
 * 校验和算法
 * @author luguoxiang
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public class CRCUtils {

    /**
     * crc32校验
     * @param bytes 数据
     * @return
     */
    public static long crc32(byte[] bytes) {
        CRC32 crc32 = new CRC32();
        crc32.update(bytes);
        return crc32.getValue();
    }

    /**
     * crc32校验
     * @param code 数据
     * @return
     */
    public static long crc32(String code){
        return crc32(code.getBytes());
    }

    /**
     * crc16校验
     * 校验字符串，如：ST=91;CN=9014;CP=&&QN=20190311173000340;CN=2051&&  计算结果: 09C0
     * @param bytes 数据
     * @return
     */
    public static int crc16(byte[] bytes) {
        int crc = 0xFFFF;
        for (byte c : bytes) {
            crc = (crc >> 8) ^ c;
            for (int j = 0; j < 8; j++) {
                int flag = crc & 0x01;
                crc >>= 1;
                if (flag == 1) {
                    crc ^= 0xA001;
                }
            }
        }
        return  crc;
    }

    /**
     * crc16校验
     * @param code 数据
     * @return
     */
    public static int crc16(String code) {
        return crc16(code.getBytes());
    }

}
